{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 随机梯度下降法\n",
    "前面我们介绍了梯度下降法的数学原理，下面我们通过例子来说明一下随机梯度下降法，我们分别从 0 自己实现，以及使用 pytorch 中自带的优化器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import torch\n",
    "from torchvision.datasets import MNIST # 导入 pytorch 内置的 mnist 数据\n",
    "from torch.utils.data import DataLoader\n",
    "from torch import nn\n",
    "from torch.autograd import Variable\n",
    "import time\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "def data_tf(x):\n",
    "    x = np.array(x, dtype='float32') / 255 # 将数据变到 0 ~ 1 之间\n",
    "    x = (x - 0.5) / 0.5 # 标准化，这个技巧之后会讲到\n",
    "    x = x.reshape((-1,)) # 拉平\n",
    "    x = torch.from_numpy(x)\n",
    "    return x\n",
    "\n",
    "train_set = MNIST('./data', train=True, transform=data_tf, download=True) # 载入数据集，申明定义的数据变换\n",
    "test_set = MNIST('./data', train=False, transform=data_tf, download=True)\n",
    "\n",
    "# 定义 loss 函数\n",
    "criterion = nn.CrossEntropyLoss()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "随机梯度下降法非常简单，公式就是\n",
    "$$\n",
    "\\theta_{i+1} = \\theta_i - \\eta \\nabla L(\\theta)\n",
    "$$\n",
    "非常简单，我们可以从 0 开始自己实现"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def sgd_update(parameters, lr):\n",
    "    for param in parameters:\n",
    "        param.data = param.data - lr * param.grad.data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们可以将 batch size 先设置为 1，看看有什么效果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch: 0, Train Loss: 0.350681\n",
      "epoch: 1, Train Loss: 0.213382\n",
      "epoch: 2, Train Loss: 0.181885\n",
      "epoch: 3, Train Loss: 0.160208\n",
      "epoch: 4, Train Loss: 0.151504\n",
      "使用时间: 473.28675 s\n"
     ]
    }
   ],
   "source": [
    "train_data = DataLoader(train_set, batch_size=1, shuffle=True)\n",
    "# 使用 Sequential 定义 3 层神经网络\n",
    "net = nn.Sequential(\n",
    "    nn.Linear(784, 200),\n",
    "    nn.ReLU(),\n",
    "    nn.Linear(200, 10),\n",
    ")\n",
    "\n",
    "# 开始训练\n",
    "losses1 = []\n",
    "idx = 0\n",
    "\n",
    "start = time.time() # 记时开始\n",
    "for e in range(5):\n",
    "    train_loss = 0\n",
    "    for im, label in train_data:\n",
    "        im = Variable(im)\n",
    "        label = Variable(label)\n",
    "        # 前向传播\n",
    "        out = net(im)\n",
    "        loss = criterion(out, label)\n",
    "        # 反向传播\n",
    "        net.zero_grad()\n",
    "        loss.backward()\n",
    "        sgd_update(net.parameters(), 1e-2) # 使用 0.01 的学习率\n",
    "        # 记录误差\n",
    "        train_loss += loss.data[0]\n",
    "        if idx % 30 == 0:\n",
    "            losses1.append(loss.data[0])\n",
    "        idx += 1\n",
    "    print('epoch: {}, Train Loss: {:.6f}'\n",
    "          .format(e, train_loss / len(train_data)))\n",
    "end = time.time() # 计时结束\n",
    "print('使用时间: {:.5f} s'.format(end - start))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x10ddd99b0>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\nHwAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10ddd9978>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x_axis = np.linspace(0, 5, len(losses1), endpoint=True)\n",
    "plt.semilogy(x_axis, losses1, label='batch_size=1')\n",
    "plt.legend(loc='best')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可以看到，loss 在剧烈震荡，因为每次都是只对一个样本点做计算，每一层的梯度都具有很高的随机性，而且需要耗费了大量的时间"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch: 0, Train Loss: 0.735301\n",
      "epoch: 1, Train Loss: 0.362765\n",
      "epoch: 2, Train Loss: 0.316051\n",
      "epoch: 3, Train Loss: 0.287766\n",
      "epoch: 4, Train Loss: 0.264757\n",
      "使用时间: 40.03663 s\n"
     ]
    }
   ],
   "source": [
    "train_data = DataLoader(train_set, batch_size=64, shuffle=True)\n",
    "# 使用 Sequential 定义 3 层神经网络\n",
    "net = nn.Sequential(\n",
    "    nn.Linear(784, 200),\n",
    "    nn.ReLU(),\n",
    "    nn.Linear(200, 10),\n",
    ")\n",
    "\n",
    "# 开始训练\n",
    "losses2 = []\n",
    "idx = 0\n",
    "start = time.time() # 记时开始\n",
    "for e in range(5):\n",
    "    train_loss = 0\n",
    "    for im, label in train_data:\n",
    "        im = Variable(im)\n",
    "        label = Variable(label)\n",
    "        # 前向传播\n",
    "        out = net(im)\n",
    "        loss = criterion(out, label)\n",
    "        # 反向传播\n",
    "        net.zero_grad()\n",
    "        loss.backward()\n",
    "        sgd_update(net.parameters(), 1e-2)\n",
    "        # 记录误差\n",
    "        train_loss += loss.data[0]\n",
    "        if idx % 30 == 0:\n",
    "            losses2.append(loss.data[0])\n",
    "        idx += 1\n",
    "    print('epoch: {}, Train Loss: {:.6f}'\n",
    "          .format(e, train_loss / len(train_data)))\n",
    "end = time.time() # 计时结束\n",
    "print('使用时间: {:.5f} s'.format(end - start))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x103d0a748>"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n0AOEE3qAcA9RQjQEnHV9sQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x103d0a7b8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x_axis = np.linspace(0, 5, len(losses2), endpoint=True)\n",
    "plt.semilogy(x_axis, losses2, label='batch_size=64')\n",
    "plt.legend(loc='best')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "通过上面的结果可以看到 loss 没有 batch 等于 1 震荡那么距离，同时也可以降到一定的程度了，时间上也比之前快了非常多，因为按照 batch 的数据量计算上更快，同时梯度对比于 batch size = 1 的情况也跟接近真实的梯度，所以 batch size 的值越大，梯度也就越稳定，而 batch size 越小，梯度具有越高的随机性，这里 batch size 为 64，可以看到 loss 仍然存在震荡，但这并没有关系，如果 batch size 太大，对于内存的需求就更高，同时也不利于网络跳出局部极小点，所以现在普遍使用基于 batch 的随机梯度下降法，而 batch 的多少基于实际情况进行考虑"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "下面我们调高学习率，看看有什么样的结果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch: 0, Train Loss: 2.462500\n",
      "epoch: 1, Train Loss: 2.304734\n",
      "epoch: 2, Train Loss: 2.305732\n",
      "epoch: 3, Train Loss: 2.304950\n",
      "epoch: 4, Train Loss: 2.304857\n",
      "使用时间: 42.85314 s\n"
     ]
    }
   ],
   "source": [
    "train_data = DataLoader(train_set, batch_size=64, shuffle=True)\n",
    "# 使用 Sequential 定义 3 层神经网络\n",
    "net = nn.Sequential(\n",
    "    nn.Linear(784, 200),\n",
    "    nn.ReLU(),\n",
    "    nn.Linear(200, 10),\n",
    ")\n",
    "\n",
    "# 开始训练\n",
    "losses3 = []\n",
    "idx = 0\n",
    "start = time.time() # 记时开始\n",
    "for e in range(5):\n",
    "    train_loss = 0\n",
    "    for im, label in train_data:\n",
    "        im = Variable(im)\n",
    "        label = Variable(label)\n",
    "        # 前向传播\n",
    "        out = net(im)\n",
    "        loss = criterion(out, label)\n",
    "        # 反向传播\n",
    "        net.zero_grad()\n",
    "        loss.backward()\n",
    "        sgd_update(net.parameters(), 1) # 使用 1.0 的学习率\n",
    "        # 记录误差\n",
    "        train_loss += loss.data[0]\n",
    "        if idx % 30 == 0:\n",
    "            losses3.append(loss.data[0])\n",
    "        idx += 1\n",
    "    print('epoch: {}, Train Loss: {:.6f}'\n",
    "          .format(e, train_loss / len(train_data)))\n",
    "end = time.time() # 计时结束\n",
    "print('使用时间: {:.5f} s'.format(end - start))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x11cb9e208>"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x11c1d6b70>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x_axis = np.linspace(0, 5, len(losses3), endpoint=True)\n",
    "plt.semilogy(x_axis, losses3, label='lr = 1')\n",
    "plt.legend(loc='best')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可以看到，学习率太大会使得损失函数不断回跳，从而无法让损失函数较好降低，所以我们一般都是用一个比较小的学习率"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "实际上我们并不用自己造轮子，因为 pytorch 中已经为我们内置了随机梯度下降发，而且之前我们一直在使用，下面我们来使用 pytorch 自带的优化器来实现随机梯度下降"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch: 0, Train Loss: 0.747158\n",
      "epoch: 1, Train Loss: 0.364107\n",
      "epoch: 2, Train Loss: 0.318209\n",
      "epoch: 3, Train Loss: 0.290282\n",
      "epoch: 4, Train Loss: 0.268150\n",
      "使用时间: 46.75882 s\n"
     ]
    }
   ],
   "source": [
    "train_data = DataLoader(train_set, batch_size=64, shuffle=True)\n",
    "# 使用 Sequential 定义 3 层神经网络\n",
    "net = nn.Sequential(\n",
    "    nn.Linear(784, 200),\n",
    "    nn.ReLU(),\n",
    "    nn.Linear(200, 10),\n",
    ")\n",
    "\n",
    "optimzier = torch.optim.SGD(net.parameters(), 1e-2)\n",
    "# 开始训练\n",
    "\n",
    "start = time.time() # 记时开始\n",
    "for e in range(5):\n",
    "    train_loss = 0\n",
    "    for im, label in train_data:\n",
    "        im = Variable(im)\n",
    "        label = Variable(label)\n",
    "        # 前向传播\n",
    "        out = net(im)\n",
    "        loss = criterion(out, label)\n",
    "        # 反向传播\n",
    "        optimzier.zero_grad()\n",
    "        loss.backward()\n",
    "        optimzier.step()\n",
    "        # 记录误差\n",
    "        train_loss += loss.data[0]\n",
    "    print('epoch: {}, Train Loss: {:.6f}'\n",
    "          .format(e, train_loss / len(train_data)))\n",
    "end = time.time() # 计时结束\n",
    "print('使用时间: {:.5f} s'.format(end - start))"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "mx",
   "language": "python",
   "name": "mx"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
